home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
program
/
tcqbsnip.zip
/
INTUTOR.TXT
< prev
next >
Wrap
Text File
|
1997-06-19
|
13KB
|
315 lines
=================================
[ QuickBasic 4.5 Tutorial ]
[ How To Use Interrupts ]
[ Copyright (c) 1996 by Tika Carr ]
=================================
(Please read disclaimer at the end of this tutorial.)
This tutorial hopes to cover the basics of how to use Interrupts in
QuickBasic. Note that this method only works in QuickBasic 4.5. I hope
to do a tutorial for those who use QBasic (which comes with MS-DOS 5.0
and higher).
1. Getting Started
You will need to have started QuickBasic 4.5 by typing the following
at the MS-DOS prompt:
QB /L QB.QLB
This QuickLiBrary will load in what you need to use interrupts.
Many new programmers avoid using interrupts because they are afraid to
damage their computer. I've noticed people mess up their system
*without* using interrupts. Sections 7 - 9 have some tips on safe
debugging and what to do if you have a crash. Further, BACK UP YOUR
HARD DRIVES! This is MOST important! And save your programs onto
floppy diskette before you run them. Ultimately, its still up to you
to protect your system. This goes for any type of programming.
2. Your First Interrupt
Type in the following and save it, then run it. We'll look at the
program and see how it all works in a moment.
=======>8 Snip 8<=======
'Example Program for CALL INTERRUPT Tutorial
'by Tika Carr
'$INCLUDE: 'QB.BI'
DIM Inregs AS RegType, Outregs AS RegType
'Int 10h (interrupt 10 hexadecimal) controls the video part.
'0Ah tells the computer to write a character on the screen.
'We'll put the letter 'A' on the screen in this example.
CLS
Inregs.ax = &HA41 'load high and low bytes into ax register (&H0A01)
Inregs.cx = 1 'write only 1 character
CALL INTERRUPT(&H10, Inregs, Outregs) 'put the character on the screen
=======>8 Snip 8<=======
'$INCLUDE: 'QB.BI' defines the type structures used for the
interrupts.
DIM Inregs AS RegType, Outregs AS RegType
The INCLUDE statement defines the type structures that is used for
interrupts. These are found in the QB.BI file that comes with
QuickBasic 4.5. The DIM Statement lets you specify what variable to
put the registers defined in RegType in, so that its easy to pass all
the registers to the interrupt.
3. What are registers and what do they do?
A register is a place where you store values, and is a more direct way
to communicate with the computer. The computer looks into registers
for specific values, and uses them to perform different tasks. For
example, we gave the computer some information in the AX register,
telling it we wanted to write something on the screen, and what we
wanted to write to the screen (the letter 'A'). We also put a value
into the CX register, telling the computer we wanted to write only one
copy of the letter 'A'. When you call an interrupt, you send all that
information along to the computer (int 10h, which accesses your
video). Basically, we just told the computer to PRINT "A" on the
screen. Registers also let the computer send information back to your
program. For example, INT 33 can give your program the X and Y
coordinates of where the mouse currently is located.
For CALL INTERRUPT: ax, bx, cx, dx, bp, si, di, flags
Defined as RegType
FOR CALL INTERRUPTX: ax, bx, cx, dx, bp, si, di, flags, ds, es
Defined as RegTypeX
Depending on the interrupt you want to use, you will need to pick the
type of call that suits it. For instance, if you don't use the es
register, then using CALL INTERRUPT would work fine. However, if the
computer will be looking into the es register for something, or if you
will need to know what is in the ds register, you will want to use the
CALL INTERRUPTX.
These definitions are all in the QB.BI file. You '$INCLUDE: 'QB.BI' in
your program, then you DIM Inregs AS RegyType, OutRegs AS RegType.
These will set up your variables so that you can access the registers.
To put something into the registers, you use Inregs, and to read the
registers, you use the OutRegs variable:
Inregs.ax is where you would put something in the AX register.
Outregs.cx is where you can find what the computer put in the CX
register.
4. Storing Values into Registers:
Since the registers take information in bytes only, you may have to do
some converting to load the registers properly. Many times an
interrupt listing will show something like:
Interrupt 10h: Video
Entry: ah = 0A write a character to the screen
al = value of character to write
bh = video page
bl = attribute or color of character
cx = number of times to write the character
This can seem confusing. How do you load the AX register? Where IS it?
There's an AH and an AL. These mean the High and Low bytes of the AX
register, respectively. Here's how you would put a value into the AX
register:
Inregs.ax = &HA41 'load high and low bytes into ax register (&H0A01)
(Note that QuickBasic likes to take away the leading 0s. Initially, we
typed it as: Inregs.ax = &H0A41)
The values go into the registers as: 0A41
HiLo
Most of the time, you probably will run into this situation:
Video$ = "0A" ' Tell computer to write to video
Character$ = "A" ' Character to write on screen
Here is how you would get it all into one register:
Character$ = HEX$(ASC(A)) ' Convert 'A' into its ASCII value in
' Hexadecimal.
Since Video$ already is in Hexadecimal, we won't need to change it.
Now, we put them together:
AX$ = Video$ + Character$ ' AX$ now contains 0A41 PRINT AX$ to
' see for yourself.
Now that we got the full Hexadecimal value to put into the AX
register, we still have to convert this into a *number*:
Inregs.ax = VAL("&H" + AX$)
This makes the string now say "&H0A41" and it also converts it into a
numeric value (using VAL). Now you have the high and low bytes
converted and stored into the AX register that will go into the
computer (Inregs). When you do the CALL INTERRUPT (&H10, Inregs,
Outregs), the values will be correctly loaded where the computer can
find them.
5. Reading the Registers
Outregs also holds register values. After you make a CALL INTERRUPT,
you can read, let's say, the high and low bytes of the BX register and
use it in your own program:
BX$ = HEX$(Outregs.bx) ' Convert the value to Hexadecimal, its
' easier to extract the high and low bytes
' this way.
Since the computer likes to truncate leading 0s, we have to convert
the value of BX$:
' Get Low and High Byte of BX
' BH$ is the high byte, BL$ is the low byte, both in Hexadecimal.
L = LEN(BX$)
IF L = 1 THEN BH$ = "0" + BX$: BL$ = "00"
IF L = 2 THEN BH$ = LEFT$(BX$, 2): BL$ = "00"
IF L = 3 THEN BH$ = "0" + LEFT$(BX$, 1): BL$ = RIGHT$(BX$, 2)
IF L = 4 THEN BH$ = LEFT$(BX$, 1): BL$ = RIGHT$(BX$, 2)
bh = VAL("&H" + BH$) ' Decimal Value of high byte of BX
bl = VAL("&H" + BL$) ' Decimal Value of low byte of BX
Note that this is only applicable for any register you need to get
specifically the low and high bytes of. Sometimes a register is a
pointer to a memory address. If that is the case, you can just use
that value directly, without any type of conversion. For example:
Address = Outregs.es
Value = Outregs.dx
POKE Address, Value
' Or do whatever you need to with the address returned.
6. Calling the Interrupt
When you do a CALL INTERRUPT you access a certain function within the
computer. For example, in CALL INTERRUPT(&H10, Inregs, Outregs) you
called the video interrupt 10h (&H10). Its best of course, to know
what interrupt does what, what to put into the registers, and what the
registers may return to your program that you may be able to use. The
best Interrupt source I've found is Ralph Brown's Interrupt List,
found on some programming BBSs and on the internet on different FTP
sites (like Oakland, SimTel, and Garbo, which you can get current
addresses for by searching Lycos at http://lycos.cs.cmu.edu)
7. What To Do About Crashes
a) BACKUP YOUR PROGRAMS BEFORE RUNNING THEM!
First and foremost, its good practice to save your program onto a
floppy diskette before you run it. When your system crashes and you
get back in, just reload the program into QuickBasic.
b) System Crashes
If your system crashes, or seems to hang, first try hitting CTRL-C or
CTRL-Pause (which is also CTRL-Break). You may have to hit ENTER
afterward to get back to the QuickBasic Interactive Debugging Editor
(IDE) to look at your program. If this don't work, reboot the computer
with CTRL-ALT-DEL (or hit the RESET button on the computer if that
didn't work). Then reload and take a look at your program. If worse
comes to worse, you can shut off the computer, wait a few moments and
turn it back on. Personally, I have always been able to recover by
breaking out of the program with CTRL-Break.
c) Disk FAT crashes
This is one situation that could occur if you are using interrupts to
access the disk drives or hard disk, and you didn't get things loaded
in right. Best to have your hard drive backed up before each
programming session if you know you'll be using interrupts that will
access the disk drives (ie. may have potential of writing to sectors
or the FAT). Another good thing to have on hand is some utilities that
repair damaged FAT tables and such. There are a number of good
commercial programs out there, and some shareware ones as well. Put
one of these on a bootable floppy.
d) Video, Sound and other hardware
Its rare that you can actually damage hardware with an interrupt call.
If something goes "haywire" the best bet is to just hit the reset
button on the PC right away. Usually, things will then reset and
recover.
8. Safe Debugging
Once you get your program written, put a remark before the CALL
INTERRUPT:
'CALL INTERRUPT (&H10, Inregs, Outregs)
Then set up the Debug to watch your variables:
HEX$(Inregs.ax)
HEX$(Outregs.bx)
Or whatever variables you are working with. Then ALT-R R to restart.
NOW SAVE THE PROGRAM TO FLOPPY DISK! Remove the disk from the drive.
Hit F8 to step through your program one instruction at a time, paying
close attention to the values in the variables. Are they loading
properly? Once you think its working, you can again save the program
and then remove the remark from the call. Step through again and pay
attention to the Outregs registers if you are using them.
It may seem like a lot to go through, but watching how your program
works step by step, especially if you're first learning to use
interrupts, will show you how the computer uses them, and how your
programs behave (for better or for worse).
9. In Closing....
Interrupts are a great way to do things in QuickBasic that you can't
find a command for. Normally, they don't hurt anything and at worse,
just make you have to restart the computer. While a risk is there to
mess up things like hard drives, its rare you'll run into that, if at
all, as long as you don't use disk interrupts until you are
comfortable with how interrupts work and how to use them. Stick with
writing for video, mouse, printer, sound card for starters. Video is
easiest, as is the mouse. And if weird things happen, don't panic -
reset. :)
******* DISCLAIMER *******
The author of this article cannot gaurantee the usability or
suitability of the information presented herein for any particular
purpose. In addition, the user of the information in this article
agrees not to hold the author, moderator or any other direct or
indirect agent liable in any way for any damages, loss of data, or
other consequences arising from use of this information. While I have
made every conscious effort to ensure the information in this tutorial
is accurate and safe to use on any PC compatible in the QuickBasic 4.5
environment, the end result depends on the person making use of the
information presented here. Use the information in this tutorial at
your own risk.
******* CONTACT INFORMATION *******
As of 8/3/96, comments, questions and suggestions, can be directed to:
FidoNet: Tika Carr 1:2613/601 or 1:2613/313
Internet: t.carr@pobox.com
=====================================================================
Tika Carr, former staff writer and later editor of GEnieLamp PC
Multimedia Magazine, has been writing QuickBasic 4.5 programs since
1989, and is a frequent contributor to the QUICK_BAS FidoNet Echo. Her
area of specialty is in "tools that make tools" (Steven Levy,
"Hackers"), meaning anything that will make things easier for
programmers to take control of the computer, and make their
imaginations come alive.
=====================================================================
Microsoft, QuickBasic 4.5, and QBasic are trademarks of Microsoft
Corporation. MS-DOS is a registered trademark of Microsoft
Corporation.